<?php

namespace App\Http\Controllers\V1;

use App\Http\Controllers\ApiBaseController;
use App\Http\Resources\SysUserResource;
use App\Models\SysLoginLog;
use App\Models\SysMenu;
use App\Models\SysRole;
use App\Models\SysUser;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\DB;

class AuthController extends ApiBaseController
{
    /**
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(Request $request)
    {
        $credentials = request(['username', 'password']);


        if (env('APP_DEBUG') == false && !captcha_api_check(request('code', ''), request('uuid', ''))) {
            return error("验证码有误");
        }


        if (!$token = auth()->attempt($credentials)) {
            SysLoginLog::createLog(
                $credentials,
                $request,
                '账号密码不匹配'
            );
            return error("账号密码不匹配");
        }
        $user = auth()->user();
        if ($user->status == 0) {
            SysLoginLog::createLog(
                $user,
                $request,
                '账号异常'
            );
            auth()->logout();
            return error("账号状态异常");
        }
        SysLoginLog::createLog(
            $user,
            $request,
            '登录成功'
        );
        return success(['token' => $token, 'expires_in' => auth()->factory()->getTTL() * 60], "登录成功");
    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        //        dd(auth()->payload()->toArray());
        return success([
            'data' => new SysUserResource(auth()->user())
        ], '获取成功');
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        if (auth()->check()) {
            auth()->logout();
        }

        return success([], '退出登录成功');
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return success(['token' => auth()->refresh(), 'expires_in' => auth()->factory()->getTTL() * 60], "刷新token成功");
    }

    public function getInfo()
    {
        $user = auth()->user();
        $user_roles = ['init'];
        if ($user->id == 1) {
            $permissions = ['*:*:*'];
        } else {
            $user_role_id = DB::table('sys_user_role')->where('user_id', $user->id)->pluck('role_id');
            if (!$user_role_id) {
                auth()->logout();
                return error("未分配角色");
            }

            $user_roles = SysRole::whereIn('id', $user_role_id)->pluck('role_key');

            //获取角色菜单
            $user_role_menu_id = DB::table('sys_role_menu')->whereIn('role_id', $user_role_id)->pluck('menu_id');
            $permissions = SysMenu::where('menu_type', 'F')->whereIn('id', $user_role_menu_id)->pluck('perms');
        }
        //permissions roles user
        return success([
            'user' => new SysUserResource($user),
            'permissions' => $permissions,
            'roles' => $user_roles
        ], '获取成功');
    }
    public function getRouters()
    {
        /*
        $str = '[{"name":"System","path":"/system","hidden":false,"redirect":"noRedirect","component":"Layout","alwaysShow":true,"meta":{"title":"系统管理","icon":"system","noCache":false,"link":null},"children":[{"name":"User","path":"user","hidden":false,"component":"system/user/index","meta":{"title":"用户管理","icon":"user","noCache":false,"link":null}},{"name":"Role","path":"role","hidden":false,"component":"system/role/index","meta":{"title":"角色管理","icon":"peoples","noCache":false,"link":null}},{"name":"Menu","path":"menu","hidden":false,"component":"system/menu/index","meta":{"title":"菜单管理","icon":"tree-table","noCache":false,"link":null}},{"name":"Dept","path":"dept","hidden":false,"component":"system/dept/index","meta":{"title":"部门管理","icon":"tree","noCache":false,"link":null}},{"name":"Post","path":"post","hidden":false,"component":"system/post/index","meta":{"title":"岗位管理","icon":"post","noCache":false,"link":null}},{"name":"Dict","path":"dict","hidden":false,"component":"system/dict/index","meta":{"title":"字典管理","icon":"dict","noCache":false,"link":null}},{"name":"Config","path":"config","hidden":false,"component":"system/config/index","meta":{"title":"参数设置","icon":"edit","noCache":false,"link":null}},{"name":"Notice","path":"notice","hidden":false,"component":"system/notice/index","meta":{"title":"通知公告","icon":"message","noCache":false,"link":null}},{"name":"Log","path":"log","hidden":false,"redirect":"noRedirect","component":"ParentView","alwaysShow":true,"meta":{"title":"日志管理","icon":"log","noCache":false,"link":null},"children":[{"name":"Operlog","path":"operlog","hidden":false,"component":"monitor/operlog/index","meta":{"title":"操作日志","icon":"form","noCache":false,"link":null}},{"name":"Logininfor","path":"logininfor","hidden":false,"component":"monitor/logininfor/index","meta":{"title":"登录日志","icon":"logininfor","noCache":false,"link":null}}]}]},{"name":"Monitor","path":"/monitor","hidden":false,"redirect":"noRedirect","component":"Layout","alwaysShow":true,"meta":{"title":"系统监控","icon":"monitor","noCache":false,"link":null},"children":[{"name":"Online","path":"online","hidden":false,"component":"monitor/online/index","meta":{"title":"在线用户","icon":"online","noCache":false,"link":null}},{"name":"Job","path":"job","hidden":false,"component":"monitor/job/index","meta":{"title":"定时任务","icon":"job","noCache":false,"link":null}},{"name":"Druid","path":"druid","hidden":false,"component":"monitor/druid/index","meta":{"title":"数据监控","icon":"druid","noCache":false,"link":null}},{"name":"Server","path":"server","hidden":false,"component":"monitor/server/index","meta":{"title":"服务监控","icon":"server","noCache":false,"link":null}},{"name":"Cache","path":"cache","hidden":false,"component":"monitor/cache/index","meta":{"title":"缓存监控","icon":"redis","noCache":false,"link":null}}]},{"name":"Tool","path":"/tool","hidden":false,"redirect":"noRedirect","component":"Layout","alwaysShow":true,"meta":{"title":"系统工具","icon":"tool","noCache":false,"link":null},"children":[{"name":"Build","path":"build","hidden":false,"component":"tool/build/index","meta":{"title":"表单构建","icon":"build","noCache":false,"link":null}},{"name":"Gen","path":"gen","hidden":false,"component":"tool/gen/index","meta":{"title":"代码生成","icon":"code","noCache":false,"link":null}},{"name":"Swagger","path":"swagger","hidden":false,"component":"tool/swagger/index","meta":{"title":"系统接口","icon":"swagger","noCache":false,"link":null}}]},{"name":"Http://ruoyi.vip","path":"http://ruoyi.vip","hidden":false,"component":"Layout","meta":{"title":"若依官网","icon":"guide","noCache":false,"link":"http://ruoyi.vip"}}]';
        return success([
            'data' => json_decode($str, 1),
        ], '获取成功');
        */

        if (auth()->id() == 1) {
            $menus = SysMenu::whereIN('menu_type', ['M', 'C'])->orderBy('order_num', 'asc')->get();
        } else {
            $user = SysUser::with('roles')->where('id', auth()->id())->first();
            $roles = $user->roles;
            $roles_id = [];
            foreach ($roles as $role) {
                $roles_id[] = $role->id;
            }
            //获取角色菜单
            $role_menus_id = DB::table('sys_role_menu')->whereIn('role_id', $roles_id)->pluck('menu_id');
            if ($role_menus_id) {
                $role_menus_id = array_unique($role_menus_id->toArray());
            }
            //获取菜单
            $menus = SysMenu::whereIn('id', $role_menus_id)->whereIN('menu_type', ['M', 'C'])->orderBy('order_num', 'asc')->get();
        }

        $menus_tree = makeTree($menus->toArray(), 'id', 'parent_id');
        $menus_routes = generateRouters($menus_tree);
        return success([
            'data' => $menus_routes,
        ], '获取成功');
    }
    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}
